<?php

namespace util;
include_once '../extend/alidb/aliyun-openapi-php-sdk-master/aliyun-php-sdk-core/Config.php';
include '../extend/alidb/aliyun-openapi-php-sdk-master/aliyun-php-sdk-push/Push/Request/V20160801/PushRequest.php';
use \Push\Request\V20160801 as Push;

class Alipush {
	//设置你自己的AccessKeyId/AccessSecret/AppKey
	/*private $accessKeyId = 'LTAI4FmtZLM3wactLdEi52tP'; 
	private $accessKeySecret = '4TcKFrb5s8ZwfOxHah3x4MxWMCQuA2';
	private $appKey_ios = "30025128";
	private $appKey_android = "30082721"; */

	private $accessKeyId = 'LTAI4G9KPip2LSwWXN7XxcYe'; 
	private $accessKeySecret = 'TVsIcAtwpteTVarJe4T1JqbkJD218x';
	private $appKey_ios = "31784181";
	private $appKey_android = ""; 
	
	public function push($alias, $title, $content, $m_type = 0) {
		try{
			$rel1 = $this -> iosPush($alias, $title, $content, $m_type);
			$rel2 = $this -> androidPush($alias, $title, $content, $m_type);//dump($rel1);dump($rel2);
            return array_out(200, '推送成功', $rel_arr);
		} catch (\Exception $e) {
            return array_out(-9999, $e -> getMessage());//异常错误 -9999
        }
	}

	public function iosPush($alias, $title, $content, $m_type) {
		try{
			$iClientProfile = \DefaultProfile::getProfile("cn-hangzhou", $this->accessKeyId, $this->accessKeySecret);
			$client = new \DefaultAcsClient($iClientProfile);
			$request = new Push\PushRequest();

			// 推送目标
			$request->setAppKey($this->appKey_ios);
			$request->setTarget("ALIAS"); //推送目标: DEVICE:推送给设备; ACCOUNT:推送给指定帐号,TAG:推送给自定义标签; ALL: 推送给全部
			$request->setTargetValue($alias); //根据Target来设定，如Target=device, 则对应的值为 设备id1,设备id2. 多个值使用逗号分隔.(帐号与设备有一次最多100个的限制)
			$request->setDeviceType("ALL"); //设备类型 ANDROID iOS ALL.
			$request->setPushType("NOTICE"); //消息类型 MESSAGE NOTICE
			$request->setTitle($title); // 消息的标题
			$request->setBody($content); // 消息的内容

			$ext_arr = [
				'm_type' 	=> $m_type,//类型 1 下线通知 0 正常推送
			];
			$ext_json = json_encode($ext_arr);//dump($ext_json);

			$request->setiOSBadgeAutoIncrement(true); // iOS应用图标右上角角标
			$request->setiOSSilentNotification("false");//是否开启静默通知
			$request->setiOSMusic("default"); // iOS通知声音
			$request->setiOSApnsEnv("DEV");//iOS的通知是通过APNs中心来发送的，需要填写对应的环境信息。"DEV" : 表示开发环境 "PRODUCT" : 表示生产环境
			$request->setiOSRemind("false"); // 推送时设备不在线（既与移动推送的服务端的长连接通道不通），则这条推送会做为通知，通过苹果的APNs通道送达一次(发送通知时,Summary为通知的内容,Message不起作用)。注意：离线消息转通知仅适用于生产环境
			$request->setiOSRemindBody("iOSRemindBody");//iOS消息转通知时使用的iOS通知内容，仅当iOSApnsEnv=PRODUCT && iOSRemind为true时有效
			$request->setiOSExtParameters($ext_json); //自定义的kv结构,开发者扩展用 针对iOS设备

			// 推送控制
			$pushTime = gmdate('Y-m-d\TH:i:s\Z', strtotime('+3 second'));//延迟3秒发送
			$request->setPushTime($pushTime);
			$expireTime = gmdate('Y-m-d\TH:i:s\Z', strtotime('+1 day'));//设置失效时间为1天
			$request->setExpireTime($expireTime);
			$request->setStoreOffline("false"); // 离线消息是否保存,若保存, 在推送时候，用户即使不在线，下一次上线则会收到

			$response = $client->getAcsResponse($request);
			$rel_arr = object2array($response);
            return array_out(200, '推送成功', $rel_arr);
		} catch (\Exception $e) {
            return array_out(-9999, $e -> getMessage());//异常错误 -9999
        }
	}

	public function androidPush($alias, $title, $content, $m_type) {
		try{
			$iClientProfile = \DefaultProfile::getProfile("cn-hangzhou", $this->accessKeyId, $this->accessKeySecret);
			$client = new \DefaultAcsClient($iClientProfile);
			$request = new Push\PushRequest();

			// 推送目标
			$request->setAppKey($this->appKey_android);
			$request->setTarget("ALIAS"); //推送目标: DEVICE:推送给设备; ACCOUNT:推送给指定帐号,TAG:推送给自定义标签; ALL: 推送给全部
			$request->setTargetValue($alias); //根据Target来设定，如Target=device, 则对应的值为 设备id1,设备id2. 多个值使用逗号分隔.(帐号与设备有一次最多100个的限制)
			$request->setDeviceType("ALL"); //设备类型 ANDROID iOS ALL.
			$request->setPushType("NOTICE"); //消息类型 MESSAGE NOTICE
			$request->setTitle($title); // 消息的标题
			$request->setBody($content); // 消息的内容

			$ext_arr = [
				'm_type' 	=> $m_type,//类型 1 下线通知 0 正常推送
			];
			$ext_json = json_encode($ext_arr);//dump($ext_json);

			// 推送配置: Android
			$request->setAndroidNotifyType("SOUND");//通知的提醒方式 "VIBRATE" : 震动 "SOUND" : 声音 "BOTH" : 声音和震动 NONE : 静音
			$request->setAndroidNotificationBarType(1);//通知栏自定义样式0-100
			$request->setAndroidNotificationChannel(1);//8.0以上
			$request->setAndroidOpenType("NONE");//点击通知后动作 "APPLICATION" : 打开应用 "ACTIVITY" : 打开AndroidActivity "URL" : 打开URL "NONE" : 无跳转
			$request->setAndroidOpenUrl("http://www.aliyun.com");//Android收到推送后打开对应的url,仅当AndroidOpenType="URL"有效
			$request->setAndroidActivity("com.alibaba.push2.demo.XiaoMiPushActivity");//设定通知打开的activity，仅当AndroidOpenType="Activity"有效
			$request->setAndroidMusic("default");//Android通知音乐
			$request->setAndroidXiaoMiActivity("com.ali.demo.MiActivity");//设置该参数后启动小米托管弹窗功能, 此处指定通知点击后跳转的Activity（托管弹窗的前提条件：1. 集成小米辅助通道；2. StoreOffline参数设为true
			$request->setAndroidXiaoMiNotifyTitle($title);
			$request->setAndroidXiaoMiNotifyBody($content);
			$request->setAndroidExtParameters($ext_json);  // 设定android类型设备通知的扩展属性

			// 推送控制
			$pushTime = gmdate('Y-m-d\TH:i:s\Z', strtotime('+3 second'));//延迟3秒发送
			$request->setPushTime($pushTime);
			$expireTime = gmdate('Y-m-d\TH:i:s\Z', strtotime('+1 day'));//设置失效时间为1天
			$request->setExpireTime($expireTime);
			$request->setStoreOffline("false"); // 离线消息是否保存,若保存, 在推送时候，用户即使不在线，下一次上线则会收到

			$response = $client->getAcsResponse($request);
			$rel_arr = object2array($response);
            return array_out(200, '推送成功', $rel_arr);
		} catch (\Exception $e) {
            return array_out(-9999, $e -> getMessage());//异常错误 -9999
        }
	}
	
	// 推送的Curl方法
	public function push_curl($param = "", $header = "") {
		if (empty ( $param )) {
			return false;
		}
		$postUrl = $this->url;
		$curlPost = $param;
		$ch = curl_init (); // 初始化curl
		curl_setopt ( $ch, CURLOPT_URL, $postUrl ); // 抓取指定网页
		curl_setopt ( $ch, CURLOPT_HEADER, 0 ); // 设置header
		curl_setopt ( $ch, CURLOPT_RETURNTRANSFER, 1 ); // 要求结果为字符串且输出到屏幕上
		curl_setopt ( $ch, CURLOPT_POST, 1 ); // post提交方式
		curl_setopt ( $ch, CURLOPT_POSTFIELDS, $curlPost );
		curl_setopt ( $ch, CURLOPT_HTTPHEADER, $header ); // 增加 HTTP Header（头）里的字段
		curl_setopt ( $ch, CURLOPT_SSL_VERIFYPEER, FALSE ); // 终止从服务端进行验证
		curl_setopt ( $ch, CURLOPT_SSL_VERIFYHOST, FALSE );
		$data = curl_exec ( $ch ); // 运行curl
		curl_close ( $ch );
		return $data;
	}

	
}